package edu.unmsm.ocaa.sisocaa.negocio.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.model.SelectItem;

import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import edu.unmsm.ocaa.sisocaa.integracion.dao.OpcPregFichaDAO;
import edu.unmsm.ocaa.sisocaa.negocio.model.dto.ComentarioOpcDTO;
import edu.unmsm.ocaa.sisocaa.negocio.model.dto.OpcPregFichaDTO;
import edu.unmsm.ocaa.sisocaa.negocio.model.dto.OpcconRespDTO;
import edu.unmsm.ocaa.sisocaa.negocio.service.ComentarioOpcService;
import edu.unmsm.ocaa.sisocaa.negocio.service.OpcPregFichaService;
import edu.unmsm.ocaa.sisocaa.negocio.service.RespuestaService;

@Service
public class OpcPregFichaServiceImpl implements OpcPregFichaService {


	@Resource
	OpcPregFichaDAO opcpreg;
	@Resource
	ComentarioOpcService comserv;
	@Resource
	RespuestaService respserv;
	
	public void guardarOpcionxPreg(OpcPregFichaDTO opc)
			throws DataAccessException {
		// TODO Auto-generated method stub
		opcpreg.insertOpcPregxFicha(opc);
		opc.setId_opcpregficha(opcpreg.getMaxOpcPregxFicha().getId_opcpregficha());
		List<ComentarioOpcDTO> coms=opc.getComens();
		for (int i = 0; i < coms.size(); i++) {
			ComentarioOpcDTO com=coms.get(i);
			if (com.getDelete().equals("black")) {
				com.setId_ficha(opc.getId_ficha());
				com.setId_pregficha(opc.getId_pregficha());
				com.setId_opcpregficha(opc.getId_opcpregficha());
				comserv.grabarComentarioOpc(com);				
			}
		}
	}


	public List<OpcPregFichaDTO> listarOpcionesxPreg(Integer idFicha,
			Integer idPregFicha) throws DataAccessException {
		// TODO Auto-generated method stub
		List<OpcPregFichaDTO> temp=opcpreg.getOpcsPregxFicha(idFicha, idPregFicha);
		for (int i = 0; i < temp.size(); i++) {
			temp.get(i).setDelete("black");
			temp.get(i).setComens(comserv.listarComentariosOpc(idFicha, 
					idPregFicha, temp.get(i).getId_opcpregficha()));
			for (int j = 0; j < temp.get(i).getComens().size(); j++) {
				temp.get(i).getComens().get(j).setDelete("black");
			}
		}
		return temp;
	}


	@Override
	public void actualizarOpcionxPreg(OpcPregFichaDTO opc)
			throws DataAccessException {
		// TODO Auto-generated method stub
		opcpreg.updateOpcPregxFicha(opc);
		List<ComentarioOpcDTO> coms=opc.getComens();
		for (int i = 0; i < coms.size(); i++) {
			ComentarioOpcDTO com=coms.get(i);
			if (com.getId_comentarioopc()>0) {
				if (com.getDelete().equals("black")) {
					comserv.actualizarComentarioOpc(com);	
				}else {
					comserv.eliminarComentarioOpc(com);
				}
				
			}else {
				if (com.getDelete().equals("black")) {
					com.setId_ficha(opc.getId_ficha());
					com.setId_pregficha(opc.getId_pregficha());
					com.setId_opcpregficha(opc.getId_opcpregficha());
					comserv.grabarComentarioOpc(com);	
				}
				
			}
		}
	}


	@Override
	public void eliminarOpcionxPreg(OpcPregFichaDTO opc)
			throws DataAccessException {
		// TODO Auto-generated method stub
		if (opc.getComens().size()>0) {
			comserv.eliminarComentariosOpc(opc.getComens().get(0));	
		}
		opcpreg.deleteOpcPregxFicha(opc);
	}


	@Override
	public void eliminarOpcionesxPreg(OpcPregFichaDTO opc)
			throws DataAccessException {
		// TODO Auto-generated method stub
		List<OpcPregFichaDTO> temp=opcpreg.getOpcsPregxFicha(opc.getId_ficha(), opc.getId_pregficha());
		for (int i = 0; i < temp.size(); i++) {
			if (temp.get(i).getComens()!=null) {
				List<ComentarioOpcDTO> coms=temp.get(i).getComens();
				comserv.eliminarComentariosOpc(coms.get(i));
			}
		}
		opcpreg.deleteOpcsPregxFicha(opc);
	}


	@Override
	public ArrayList<SelectItem> listarOpcionesxPregSelectItem(Integer idFicha,
			Integer idPregFicha) throws DataAccessException {
		// TODO Auto-generated method stub
		List<OpcPregFichaDTO> temps=opcpreg.getOpcsPregxFicha(idFicha, idPregFicha);
		ArrayList<SelectItem> listItem=new ArrayList<SelectItem>();
		for (int i = 0; i < temps.size(); i++) {
			OpcPregFichaDTO temp=temps.get(i);
			listItem.add(new SelectItem(temp.getId_opcpregficha(), temp.getDsc_opcpregficha()));
		}
		return listItem;
	}
	
	@Override
	public OpcPregFichaDTO obtenerOpcion(Integer idFicha, Integer idPregFicha,
			Integer idOpcPregFicha) throws DataAccessException {
		// TODO Auto-generated method stub
		return opcpreg.getOpcPregxFicha(idFicha, idPregFicha, idOpcPregFicha);
	}


	@Override
	public List<OpcconRespDTO> listarOpcionesconResp(Integer idFicha,
			Integer idPregficha, Integer idDep) {
		// TODO Auto-generated method stub
		List<OpcPregFichaDTO> lisopc= listarOpcionesxPreg(idFicha, idPregficha);
		List<OpcconRespDTO> listopcconresp=new ArrayList<OpcconRespDTO>();
		for (int i = 0; i < lisopc.size(); i++) {
			OpcPregFichaDTO opc=lisopc.get(i);
			Integer totrespsxopc;
			Integer totpregrespondidas;
			Double porcentaje;
			OpcconRespDTO opcresp=new OpcconRespDTO();
			opcresp.setDesc_opcpregficha(opc.getDsc_opcpregficha());
			opcresp.setId_ficha(idFicha);
			opcresp.setId_opcpregficha(opc.getId_opcpregficha());
			opcresp.setId_pregficha(idPregficha);
			opcresp.setPtje1(opc.getPuntaje());
			opcresp.setPtj2(opc.getPuntaje2());
			totrespsxopc=respserv.listarRespuestasxPregTotales(idFicha, idPregficha,opc.getId_opcpregficha(), idDep);
			totpregrespondidas=respserv.listarPregsRespondidasTotales(idFicha, idPregficha, idDep);
			porcentaje=(totrespsxopc*100)/totpregrespondidas.doubleValue();
			opcresp.setNumeroRespondidas((double)Math.round(porcentaje*100)/100);
			listopcconresp.add(opcresp);
		}
		return listopcconresp;
	}


	@Override
	public Double obtenerTotPuntajes(Integer idFichaParam, Integer idPregficha, Integer id_dep, Integer pond) {
		// TODO Auto-generated method stub
		Integer totpregrespondidas;
		Integer ptjexpreg;
		Double porcentaje;
		totpregrespondidas=respserv.listarPregsRespondidasTotales(idFichaParam, idPregficha, id_dep);
		ptjexpreg=respserv.sumaPuntajesxPreg(idFichaParam, idPregficha, id_dep, pond);
		porcentaje=(ptjexpreg*100)/totpregrespondidas.doubleValue();
		return (double)Math.round(porcentaje*100)/100;
	}

}
